在打文章時腦中不知為何一直響起 smooth operatorrrrrr~
所以今天 BGM 就來首 Smooth Operator by Sade 吧 XD
昨天提到框架有以下優點:
接下來說說 Spring Framework 中的兩個重要的 core technologies
Inversion Control 控制反轉:將 object 的控制權交給了外部的 Spring 容器來管理,再透過 @Autowired
註解依賴注入取得容器中的 object
優點:
傳統 Java → company 和 keyboard 相依性高
public class LogiKeyboard implements Keyboard{
@Override
public void type(String message){
System.out.println("羅技鍵盤:" + message);
}
}
public class company{
private Keyboard keyboard = new LogiKeyboard();
private void working(){
keyboard.type("I'm now working.");
}
}
Spring IoC → 透過 @Autowired 依賴注入,取得存在 Spring 容器中的物件,company 依賴於 logiKeyboard
@Component
public class LogiKeyboard implements Keyboard{
@Override
public void type(String message){
System.out.println("羅技鍵盤:" + message);
}
}
@Component
public class company{
@Autowired
private Keyboard keyboard;
private void working(){
keyboard.type("I'm now working.");
}
}
用比較生活化的例子解釋:
在開發過程中沒有 IoC 代表所有東西都必須手刻,自行創建、自行配置和自行管理所有的物件 & 依賴關係。而有了 IoC ,這些麻煩事則交由框架自動完成。
AOP (Aspect-Oriented Programming):
Spring 的這個功能允許我們自定義 Aspects
(切面),而這些切面是橫切於多個方法或物件的 關注點
,在 log & Transaction & Security 等也都有使用 AOP 的概念
想像一下你在煮東西 (對,又在吃 XD)。
料理時的每個步驟 (例如切菜、炒菜、蒸飯) 都可以視作是一個方法的執行。這些都算是 `烹調` 這件事主要的業務邏輯。
身為一個病態潔癖仔(???),我在 🅐 烹飪前都會先洗手,🅑 烹飪後清理廚房。
這些動作 (洗手和清理) 是 `橫切` 在所有的烹調動作中,也是所謂 Aspects 的關注點 `Cross-Cutting Concern`。
在這個情境中,Spring AOP 就像是我的烹飪小幫手。
只要告訴這個小幫手:「在我烹飪前,提醒我洗手;完成後,請清理廚房。」這裡, `提醒洗手` 和 `清理廚房` 就是 AOP 中的 `Advice`,而 `開始烹飪` 和 `完成烹飪` 則為 `Join Points`。最後,我所設定的 `在開始前` 和 `完成後` 就是 `Pointcuts`。
AOP 的好處在這情境中可以讓我專注於核心任務 (煮食物 XD),而不是每次都去擔心這些 Aspects 任務,因為我知道有小幫手(AOP)會幫我處理。而在框架中,AOP 利用 橫切
技術將封裝物件拆解,將重複部分(幾乎都和業務邏輯無關)重新封裝提取出來,如此一來可以大大降低系統間的耦合度,並且增加程式碼的可維護性。
以下是幾個 AOP 觀念中的名詞術語:
Aspect
:切面,橫切的關注點。它定義了切面的功能和它的觸發時機。Join Point
:程式執行時某個特定點,例如某方法的執行。在 Spring AOP 中,Join Point 通常是一個函數。Advice
:Aspect 在特定 Join Point 上執行的動作。主要類型包括:前置 (before)、後置 (after)、返回後 (after returning)、拋出異常後 (after throwing) 和周圍 (around)。Pointcut
:一組 Join Point,設定要被 AOP 切入的位置,例如某個類別或函數。Target Object
:被一至多個切面所 target 的物件。以上是兩個 Spring 框架中很重要的核心概念,希望這些舉例能幫助理解這些偏抽象的技術
有關 IoC 和 AOP 的文件及相關程式碼還是建議參考官方 document,這篇更像是我換句話說自行詮釋理解後的版本~